/**
 *  类型守卫: 类型保护是可执行运行时检查的一种表达式，用于确保该类型在一定的范围内
 *  类型保护可以保证一个字符串是一个字符串，尽管它的值也可以是一个数值。类型保护与特性检测并不是完全不同，其主要思想是尝试检测属性、方法或原型，以确定如何处理值。目前主要有四种的方式来实现类型保护：
 */

// in 关键字
// 定义两个接口
interface Admin {
  name: String;
  privileges: string[]
}
interface Employ {
  name: string;
  startDate: Date
}

// 
type UnknownEmployee = Employ | Admin


function printEmployInformation(emp: UnknownEmployee) {
  console.log("Name: " + emp.name);
  if ("privileges" in emp) {
    console.log("Privileges: " + emp.privileges);
  }
  if ("startDate" in emp) {
    console.log("Start Date: " + emp.startDate, 1);
  }
}
const empValue = { name: "这是名字", privileges: ["1", "这是二"] }
console.log(printEmployInformation(empValue));
